import request from '@/utils/request'
import { defineStore } from "pinia"
import { CartItem } from '@/types/cart'
import { ApiRes } from '@/types/data'
import useStore from '..'
const useCartStore = defineStore('cart', {
  // 状态
  state() {
    return {
      list: [] as CartItem[] // 购物车数组
    }
  },
  // 开启pinia-plugin-persistedstate插件持久化存储
  persist: true, // 全部存储当前模块的state中的数据
  // persist: {
  //   paths: ['list'], // 指定要持久化处理的stat中的某些数据
  //   key: 'vue-ts-rabbit-cart', // 指定存储的key
  //   storage: window.sessionStorage // 默认是localStorage
  // },
  // 方法
  actions: {
    // 加入购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        await request.post('/member/cart', { skuId: data.skuId, count: data.count })
        // 加入购物车完成后 重新获取一次购物车列表
        this.getCartList()
      } else {
        // console.log(data)
        // 如果购买的商品规格的SKUID已经存在, 只需要更新对应当前商品的数量
        const goods = this.list.find(item => item.skuId === data.skuId)
        if (goods) {
          goods.count += data.count
        } else {
          // 反之的直接追加
          this.list.unshift(data)
        }

      }
    },
    // 获取购物车列表
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        this.list = res.data.result
      } else {
        type InfoType = {
          discount: null
          isEffective: boolean
          nowPrice: number
          oldPrice: null
          stock: number
        }
        // 即便未登录,也要获取一次购物车数据最新的信息(价格, 库存, 有效...)
        // request.get(`/goods/stock/${每一个商品的skuId}`)
        this.list.forEach(async item => {
          const res = await request.get<ApiRes<InfoType>>(`/goods/stock/${item.skuId}`)
          // console.log(res.data.result)
          // 将获取到最新的商品信息的数据同步
          item.isEffective = res.data.result.isEffective
          item.nowPrice = res.data.result.nowPrice.toFixed(2)
          item.stock = res.data.result.stock
        })

      }
    },
    // 删除、清空购物车
    async delCart(ids: string[]) {

      if (this.isLogin) {
        // delete 删除携带的如果是查询参数  params
        // 请求体 data携带
        await request.delete('/member/cart', { data: { ids } })
        // 删除购物车完成后 重新获取一次购物车列表
        this.getCartList()
      } else {
        // 留下未删除的商品
        // this.list = this.list.filter(item => item.skuId !== ids[0]) // 只能删一个,涉及到批量操作不能实现
        this.list = this.list.filter(item => !ids.includes(item.skuId)) //既能实现单个删除,也能实现批量删除
      }
    },
    // 修改购物车商品 (商品的选中状态或商品的数量)
    async updateGoods(skuId: string, data: { selected?: boolean, count?: number }) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 修改购物车完成后 重新获取一次购物车列表
        this.getCartList()
      } else {
        // 1. 先找到对应的skuId的商品
        const obj = this.list.find(item => item.skuId === skuId)
        // 2. 更新数量
        if (data.count !== undefined) {
          obj!.count = data.count
        }
        // 3.更新状态
        if (data.selected !== undefined) {
          obj!.selected = data.selected
        }
      }
    },
    // 修改所有商品状态(全选反选)
    async changeAllSelected(selected: boolean) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', { selected })
        // 修改购物车完成后 重新获取一次购物车列表
        this.getCartList()
      } else {
        this.list.forEach(item => item.selected = selected)
      }
    },
    // 清空购物车
    clearCart() {
      this.list = []
    },
    // 合并购物车
    async mergeCart() {
      // 准备后端要的三个字段 收集到一个对象中 并且要一个数组
      const arr = this.list.map(item => {
        return {
          skuId: item.skuId,
          selected: item.selected,
          count: item.count
        }
      })
      await request.post('/member/cart/merge', arr)
      // 重新获取一次购物车列表
      this.getCartList()
    }
  },
  // 计算
  getters: {
    // 正常要统计所有商品的数量和商品的价格
    // 但是有的商品会失效 没有库存, 先得到一个有效商品的列表, 再去统计数量和总价
    // 有效商品列表 有库存并且没有失效
    effectiveList(): CartItem[] {
      return this.list.filter(item => item.isEffective && item.stock > 0)
    },
    // 有效商品的总数量
    count(): number {
      /*  let sum = 0
       this.effectiveList.forEach(item => {
         sum += item.count
       })
       return sum */
      return this.effectiveList.reduce((sum: number, item: CartItem) => sum + item.count, 0)
    },
    // 有效商品的总价
    allprice(): string {
      return this.effectiveList.reduce((sum: number, item: CartItem) => sum + item.count * +item.nowPrice, 0).toFixed(2)
    },
    // 全选反选计算属性
    isAllChecked(): boolean {
      return this.effectiveList.length > 0 && this.effectiveList.every(item => item.selected)
    },
    // 已选商品的数组 将selected属性为true过滤出来
    selectedList(): CartItem[] {
      return this.effectiveList.filter(item => item.selected)
    },
    // 选中商品的数量
    seletedCount(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 选中商品的总价
    selectedPrice(): string {
      return this.selectedList.reduce((sum, item) => sum + item.count * +item.nowPrice, 0).toFixed(2)
    },
    // 用户是否登录的getter
    isLogin(): boolean {
      const { user } = useStore()
      // return user.userInfo.token ? true : false
      return !!user.userInfo.token
    }

  },

})

export default useCartStore